/*
————————————————————————————————————————————————————————————————————————————————————
｜ 本文件用于将浏览器的请求正文信息，形成临时文件，主要是形成src文件
｜ 设计思路：
｜ 在这里我们默认已经拿到了请求正文的信息，再对该正文信息做解析
｜ 1. 反序列化：拿到各个请求信息的字段，如 代码、输入参数、时间复杂度、空间复杂度等
｜ 2. 并将code部分加载到临时的源文件中
————————————————————————————————————————————————————————————————————————————————————
*/
#pragma once
#include <iostream>
#include <string>
#include <fstream>

#include <jsoncpp/json/json.h>

#include "../Comm/Comm.hpp"

namespace ns_parse
{
    class In_Put
    {
    public:
        In_Put(const std::string &in_put)
            : _in_put(in_put), _code(std::string()), _cin_nums(std::string()), _cpu(1), _as(20)
        {
        }
        ~In_Put() {}

    public:
        // 解析正文各部分
        bool Parse()
        {
            // 反序列化
            Json::Value in;
            Json::Reader reader;
            if(!reader.parse(_in_put, in))  {return false;}
            _code = in["code"].asCString();
            _cin_nums = in["cin_nums"].asCString();
            _cpu = in["cpu"].asInt();
            _as = in["as"].asInt();
            return true;
        }

        // 形成唯一的src文件，并将浏览器的上提交的代码加载到src文件中
        bool MakeSrc(std::string& src_name)
        {
            src_name = FileOper::File::GetOwnFileName();
            if(!FileOper::File::MessageToFile(FileOper::File::Src(src_name), _code)) 
                return false;
            return true;
        }

        std::string Getcode() { return _code; }
        std::string GetCinNum() { return _cin_nums; }
        int GetCPU() { return _cpu; }
        int GetAS() { return _as; }

    private:
        std::string _in_put; // 请求正文信息
    private:
        std::string _code;     // 代码部分
        std::string _cin_nums; // 输入参数部分
        int _cpu;              // 时间复杂度，允许占用CPU时间的上限时长
        int _as;               // 空间复杂度，允许占用进程地空间的上限大小
    };
};